package com.vgemv.jsutilitysdk.reflectservice;

import android.content.Context;
import android.view.View;

import java.lang.reflect.Field;
import java.util.ArrayList;

/**
 * 功能:方便UI操作
 */
public class JsjReflectManager {


    /**
     * 将界面元素的id和对象属性进行绑定,要求id字符串和属性名字一样.
     * 如果找不到对应id的对象属性,将触发断言异常
     * @param arrName
     */
    public static void bindUiElementWithIdAndPropertyByName(String [] arrName, Object obj, Context context,View rootView) {
        for(String name : arrName ) {
            try {
                Field field = obj.getClass().getDeclaredField(name);
                int id = context.getResources().getIdentifier(name, "id", context.getPackageName());
                View v = rootView.findViewById(id);
                field.setAccessible(true);
                field.set(obj, v);
            } catch (Exception e) {
                e.printStackTrace();
                String str_propertyNames = "all property name is:"+getPropertiesNameArr(obj);
//                //GajLogManager.log(.v_throw(e,str_propertyNames);
            }
        }
    }

    public static String getPropertiesNameArr(Object obj) {

        ArrayList<String> al_str = new ArrayList<String>();
        // 返回 Field 对象的一个数组，这些对象反映此 Class 对象所表示的类或接口所声明的所有字段
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            try {
                // setAccessible(boolean flag)
                // 将此对象的 accessible 标志设置为指示的布尔值。
                // 通过设置Accessible属性为true,才能对私有变量进行访问，不然会得到一个IllegalAccessException的异常
                field.setAccessible(true);
                String name = field.getName();
                al_str.add(name);
            } catch (Exception e) {

            }
        }
        return al_str.toString();
    }
}
